package Day_0216.JVM.GarbageCollection;

/**
 * @author zxc
 * @date 2023/02/16 13:22
 **/
public class JVM_Garbage_Collector {
    public static void main(String[] args) {
        /**
         * JVM中的垃圾回收器
         * ===》
         * 1.如果说垃圾收集算法是内存回收的方法论，那么垃圾收集器就是内存回收的具体实现。
         *
         * 2.用于不同分代的收集器，
         * （1）其中用于回收新生代的收集器，包括Serial、PraNew、Parallel Scavenge，
         * （2）回收老年代的收集器，包括Serial Old、Parallel Old、CMS，
         * （3）还有用于回收整个Java堆的G1收集器。
         *
         * 3.简述不同垃圾回收器之间的功能区别
         * 专用于新生代的垃圾收集器 ：
         * （1）Serial收集器（复制算法):
         *  新生代单线程收集器，标记和清理都是单线程，优点是简单高效;
         *
         * （2）ParNew收集器 (复制算法):
         *  新生代并行收集器，实际上是Serial收集器的多线程版本，在多核CPU环境下，有着比Serial更好的表现；
         *
         * （3）Parallel Scavenge收集器 (复制算法):
         *  新生代并行收集器，追求高吞吐量，高效利用 CPU。
         *  吞吐量= 用户线程时间/(用户线程时间 + GC线程时间);
         *  高吞吐量可以高效率地利用CPU时间，尽快完成程序的运算任务，适合后台应用对交互响应要求不高的场景；
         *
         * 专用于老年代的垃圾收集器：
         * （1）Serial Old收集器 (标记-整理算法):
         *  老年代单线程收集器，Serial收集器的老年代版本；
         *
         * （2）Parallel Old收集器 (标记-整理算法)：
         *  老年代并行收集器，吞吐量优先，Parallel Scavenge收集器的老年代版本；
         *
         * （3）CMS(Concurrent Mark Sweep)收集器（标记-清除算法）：
         *  老年代并行收集器，以获取最短回收停顿时间为目标的收集器，具有高并发、低停顿的特点，追求最短GC回收停顿时间。
         *  ===》
         *  CMS垃圾收集器是一种以获得最短回收停顿时间为目标的收集器;其在垃圾收集结束以后，会产生大量的内存碎片;
         *
         * 适用于新生代 && 老年代的垃圾收集器 ：
         * ===》G1(Garbage First)收集器 (标记-整理算法)：
         * Java堆并行收集器，G1收集器是JDK1.7提供的一个新收集器，
         * G1收集器基于“标记-整理”算法实现，也就是说不会产生内存碎片。
         * 此外，G1收集器不同于之前的收集器的一个重要特点是：G1回收的范围是整个Java堆(包括新生代，老年代)
         *
         */

        /**
         * Serial 和 Parallel收集器之间的区别
         * ===》
         * 1.Serial 与 Parallel 在 GC 执行的时候都会引起 stop-the-world。
         * 2.它们之间主要不同：
         * （1）serial 收集器是默认的复制收集器，执行 GC 的时候只有一个线程，
         * （2）parallel 收集器，使用多个 GC 线程来执行。
         *
         */

        /**
         * CMS 垃圾收集器和G1 垃圾收集器之间的区别
         * ===》
         * 1.CMS收集器是老年代的收集器，可以配合新生代的Serial和ParNew收集器一起使用；
         * 2.G1收集器收集范围是老年代和新生代，不需要结合其他收集器使用；
         * 3.CMS收集器，以最小的停顿时间为目标的收集器；
         * 4.G1收集器，可预测垃圾回收的停顿时间
         * 5.CMS收集器是使用“标记-清除”算法进行的垃圾回收，容易产生内存碎片
         * 6.G1收集器使用的是“标记-整理”算法，进行了空间整合，降低了内存空间碎片。
         *
         */

        /**
         * 请详细介绍一下各种垃圾回收器
         * ===》
         * 一，CMS垃圾收集器
         * 1.CMS 是英文 Concurrent Mark-Sweep 的简称，是以牺牲吞吐量为代价，来获得最短回收停顿时间的垃圾回收器。
         * ===》
         * （1）最短的垃圾收集停顿时间，可以为交互比较高的程序，提高用户体验。
         * （2）对于要求服务器响应速度的应用上，这种垃圾回收器非常适合。
         *
         * 2.在启动 JVM 的参数加上“-XX:+UseConcMarkSweepGC”，来指定使用 CMS 垃圾回收器。
         *
         * 3.CMS 使用的是标记-清除的算法实现的，所以在 gc 的时候，会产生大量的内存碎片，
         * 当剩余内存不能满足程序运行要求时，系统将会出现 Concurrent Mode Failure，
         * 临时 CMS 会采用 Serial Old 回收器进行垃圾清除，此时的性能将会被降低。
         *
         * 二，Serial 垃圾收集器（单线程、 复制算法）
         * 1.Serial（英文连续） 是最基本垃圾收集器，使用复制算法，曾经是JDK1.3.1 之前新生代唯一的垃圾收集器。
         *
         * 2.Serial 是一个单线程的收集器， 它不但只会使用一个 CPU 或一条线程去完成垃圾收集工作，
         * 并且在进行垃圾收集的同时，必须暂停其他所有的工作线程（stop-the-world），直到垃圾收集结束。
         *
         * 3.Serial 垃圾收集器，虽然在收集垃圾过程中需要暂停所有其他的工作线程，但是它简单高效，
         * 对于限定单个 CPU 环境来说，没有线程交互的开销，可以获得最高的单线程垃圾收集效率，
         * 因此 Serial垃圾收集器，依然是 java 虚拟机运行在 Client 模式下，默认的新生代垃圾收集器。
         *
         * 三，ParNew 垃圾收集器（即，等价于 Serial + 多线程）
         * 1.ParNew 垃圾收集器，其实是 Serial 收集器的多线程版本，也使用复制算法，
         * 除了使用多线程进行垃圾收集之外，其余的行为和 Serial 收集器完全一样，
         * ParNew 垃圾收集器在垃圾收集过程中，同样也要暂停所有其他的工作线程（stop-the-world）。
         *
         * 2.ParNew 收集器，默认开启和 CPU 数目相同的线程数，可以通过-XX:ParallelGCThreads 参数来限制垃圾收集器的线程数。
         *
         * 3.ParNew 虽然是除了多线程外，和Serial 收集器几乎完全一样，
         * 但是ParNew垃圾收集器是很多 java虚拟机运行在 Server 模式下新生代的默认垃圾收集器。
         *
         * 四，Parallel Scavenge 收集器（多线程复制算法、高效）
         * 1.Parallel Scavenge 收集器，也是一个新生代垃圾收集器，同样使用复制算法，也是一个多线程的垃圾收集器;
         *
         * 2.它重点关注的是，程序达到一个可控制的吞吐量;（Parallel Scavenge垃圾收集器，是以高吞吐量为目的;）
         * （Thoughput， CPU 用于运行用户代码的时间/CPU总消耗时间，即,吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)），
         * ===》
         * （1）高吞吐量，可以最高效率地利用 CPU 时间，尽快地完成程序的运算任务，主要适用于在后台运算，而不需要太多交互的任务。
         * （2）适用场景 ：对于用户交互要求较低的场景下（即，用户交互要求较高的场景，需要使得垃圾回收停顿时间尽可能的短;）
         *
         * 4.自适应调节策略也是 ParallelScavenge 收集器与 ParNew 收集器的一个重要区别。
         *
         * 五，Serial Old 收集器（单线程 + 标记-整理算法 ）
         * 1.Serial Old 是 Serial 垃圾收集器年老代版本，
         * 它同样是个单线程的收集器，使用标记-整理算法，这个收集器也主要是运行在 Client 默认的java 虚拟机默认的年老代垃圾收集器。
         *
         * 2.在 Server 模式下，主要有两个用途：
         * （1）在 JDK1.5 之前版本中与新生代的 Parallel Scavenge 收集器搭配使用。
         * （2）作为年老代中使用 CMS 收集器的后备垃圾收集方案。新生代 Serial 与年老代 Serial Old 搭配垃圾
         *
         * 六，Parallel Old 收集器（多线程 + 标记-整理算法）
         * 1.Parallel Old 收集器，是Parallel Scavenge的年老代版本，使用多线程的标记-整理算法，在 JDK1.6才开始提供。
         *
         * 2.在 JDK1.6 之前，新生代使用 Parallel Scavenge 收集器只能搭配年老代的 Serial Old 收集器，
         * 只能保证新生代的吞吐量优先，无法保证整体的吞吐量，
         *
         * 3.在 JDK1.6才开始， Parallel Old 为了在年老代，同样提供吞吐量优先的垃圾收集器，
         * 如果系统对吞吐量要求比较高，可以优先考虑新生代Parallel Scavenge和年老代 Parallel Old 收集器的搭配策略。
         *
         * 4.适用场景 ：
         * 在注重吞吐量以及CPU资源敏感的场合，都可以优先考虑Parallel Scavenge加Parallel Old收集器。
         *
         * 七，G1垃圾收集器
         * 1.Garbage first 垃圾收集器是目前垃圾收集器理论发展的最前沿成果；
         * 相比与 CMS 收集器， G1 收集器两个最突出的改进是：
         * （1）基于标记-整理算法，不产生内存碎片。
         * （2）可以非常精确控制 垃圾回收停顿时间，在不牺牲吞吐量前提下，实现低停顿垃圾回收。
         *
         * 2.G1 收集器避免全区域垃圾收集，它把堆内存划分为大小固定的几个独立区域，并且跟踪这些区域的垃圾收集进度，
         * 同时在后台维护一个优先级列表，每次根据所允许的收集时间，优先回收垃圾最多的区域。
         * 区域划分和优先级区域回收机制，确保 G1 收集器可以在有限时间获得最高的垃圾收集效率;
         * ===》 即，G1垃圾收集器是可以对于全区域进行垃圾回收的;（新生代 + 老年代）
         *
         *
         */
    }
}
